type EventHandler = (actor: any, ...args: any[]) => void;

class ActorEventDispatcher {
    private dispatcher: Map<number, EventHandler[]> = new Map();
    ActorEventDispatcher() {
        _G["OnTriggerEvent"] = (...args:[any,number,any[]]) => this.OnTriggerEvent(...args);
    }
    /**
     * 将事件处理程序注册到事件表中
     *
     * @param tab 事件表，映射事件ID到事件处理程序的数组
     * @param eventId 事件ID
     * @param proc 事件处理程序
     */
    private  regEventToTable(tab: Map<number, Function[]>, eventId: number, proc: Function): void {
        if (!tab.has(eventId)) {
            tab.set(eventId, []);
        }
        let procs = tab.get(eventId)!;
        for (let i = 0; i < procs.length; i++) {
            if (procs[i] == proc) {
                assert(false, "event already registered for event id: " + eventId);
                return;
            }
        }
        procs.push(proc);
    }
    /**
     * 从事件表中注销指定事件的事件处理器
     *
     * @param tab 事件表，类型为Map<number, Function[]>，键为事件ID，值为事件处理器数组
     * @param eventId 事件ID，类型为number
     * @param proc 事件处理器，类型为Function
     */
    private  unRegEventToTable(tab: Map<number, Function[]>, eventId: number, proc: Function): void {
        if (!tab.has(eventId)) {
            return;
        }
        let procs = tab.get(eventId)!;
        for (let i = procs.length - 1; i >= 0; i--) {
            if (procs[i] == proc) {
                procs.splice(i, 1);
                return;
            }
        }
    }
    /**
     * 注册事件处理函数
     *
     * @param eventId 事件ID
     * @param proc 事件处理函数
     */
    public  regEvent(eventId: number, proc: Function): void {
        if (this.dispatcher.has(eventId)) {
            assert(false, "event already registered");
            return;
        }
        if (proc == null) {
            assert(false, "proc is null,event id is: " + eventId);
            return;
        }
        this.regEventToTable(this.dispatcher, eventId, proc);
    }
    /**
     * 取消注册事件
     *
     * @param eventId 事件ID
     * @param proc 事件处理函数
     */
    public  unRegEvent(eventId: number, proc: Function): void {
        if (!this.dispatcher.has(eventId)) {
            return;
        }
        this.unRegEventToTable(this.dispatcher, eventId, proc);
    }
    /**
     * 触发事件处理器
     *
     * @param actor 事件触发者
     * @param event_id 事件ID
     * @param ...args 传递给事件处理器的参数
     */
    public OnTriggerEvent(actor: any, event_id:number,...args: any[]): void {
        const handlers = this.dispatcher.get(event_id);
        if (!handlers) {
            console.warn(`未注册的事件 ID: ${event_id}`);
            return;
        }
        handlers.forEach(handler => {
            handler(actor, ...args);
        });
    }
}
export = new ActorEventDispatcher();